//package com.cxmx.prime.base;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.parser.Feature;
//import com.mongodb.client.result.DeleteResult;
//import com.mongodb.client.result.UpdateResult;
//import org.apache.commons.collections.MapUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.domain.Sort;
//import org.springframework.data.domain.Sort.Direction;
//import org.springframework.data.mongodb.core.MongoTemplate;
//import org.springframework.data.mongodb.core.query.Criteria;
//import org.springframework.data.mongodb.core.query.Query;
//import org.springframework.data.mongodb.core.query.Update;
//
//import java.util.*;
//import java.util.Map.Entry;
//
//
///**
// * MongoDB工具类
// *
// * @author: bai
// * @date: 2018年4月8日 下午2:43:39
// */
//@SuppressWarnings({"unchecked", "rawtypes"})
//public class BaseMongoImpl implements IBaseMongo {
//
//    @Autowired
//    protected MongoTemplate mongoTemplate;
//
//    @Override
//    public <T> List<T> find(Query query, Class<T> entityClass) throws Exception {
//        return mongoTemplate.find(query, entityClass);
//    }
//
//    @Override
//    public PagerDTO selectPage(Query query, Class entityClass, PagerDTO pagerDto) throws Exception {
//        long total = mongoTemplate.count(query, entityClass);
//        List results = null;
//        if (total > 0) {
//            pagerDto.init(total);
//            query.skip((pagerDto.getPageNum() - 1) * pagerDto.getPageSize());
//            query.limit(pagerDto.getPageSize());
////			this.getOrderByToQuery(query, pagerDto.getOrderByParam());
//            results = mongoTemplate.find(query, entityClass);
//            pagerDto.setResult(results);
//        } else {
//            pagerDto.setResult(Collections.emptyList());
//        }
//        return pagerDto;
//    }
//
//    /**
//     * 组装排序字段至Qeury对象
//     *
//     * @param query
//     * @param orderByParam
//     * @return
//     */
//    protected void getOrderByToQuery(Query query, String orderByParam) {
//        if (StringUtils.isNotEmpty(orderByParam)) {
//            Map<String, Integer> orderMap = JSON.parseObject(orderByParam,
//                    LinkedHashMap.class, Feature.OrderedField); // 有序的输出Map
//            if (MapUtils.isNotEmpty(orderMap)) {
//                for (Entry<String, Integer> entry : orderMap.entrySet()) {
//                    String key = entry.getKey();
//                    int value = entry.getValue();
//                    if (value == 1) {
//                        query.with(new Sort(Direction.ASC, key));
//                    } else {
//                        query.with(new Sort(Direction.DESC, key));
//                    }
//                }
//            }
//        }
//    }
//
//    @Override
//    public long selectCount(Query query, Class entityClass) throws Exception {
//        long count = 0;
//        if (query != null) {
//            count = mongoTemplate.count(query, entityClass);
//        }
//        return count;
//    }
//
//    @Override
//    public Object findOne(Query query, Class entityClass) throws Exception {
//        return mongoTemplate.findOne(query, entityClass);
//    }
//
//    @Override
//    public Object findOne(Map<String, Object> param, Class entityClass) throws Exception {
//        Query query = this.parseParams(param);
//        return mongoTemplate.findOne(query, entityClass);
//    }
//
//    @Override
//    public boolean insert(Object entity) {
//        try {
//            mongoTemplate.insert(entity);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//        return true;
//    }
//
//    @Override
//    public boolean insertAll(List list) {
//        try {
//            mongoTemplate.insertAll(list);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//        return true;
//    }
//
//    @Override
//    public boolean removes(Query query, Class entityClass) {
//        try {
//            DeleteResult result = mongoTemplate.remove(query, entityClass);
//            return result.getDeletedCount() > 0 ? true : false;
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//    }
//
//    @Override
//    public boolean updateById(String fieldName, Object id, Map<String, Object> param, Class entityClass) throws Exception {
//        Query query = new Query();
//        query.addCriteria(Criteria.where(fieldName).is(id));
//        Update update = this.parseUpdate(param);
//        UpdateResult result = mongoTemplate.updateFirst(query, update, entityClass);
//        return result.getModifiedCount() > 0 ? true : false;
//    }
//
//    @Override
//    public boolean updateAll(Query query, Map<String, Object> param, Class entityClass) throws Exception {
//        Update update = this.parseUpdate(param);
//        UpdateResult result = mongoTemplate.updateMulti(query, update, entityClass);
//        return result.getModifiedCount() > 0 ? true : false;
//    }
//
//    @Override
//    public boolean exist(Query query, Class entityClass) throws Exception {
//        return mongoTemplate.exists(query, entityClass);
//    }
//
//    /**
//     * 格式化查询条件
//     *
//     * @param param
//     * @return
//     */
//    private Query parseParams(Map<String, Object> param) {
//        Query query = new Query();
//        if (param != null && !param.isEmpty()) {
//            Iterator<Entry<String, Object>> it = param.entrySet().iterator();
//            while (it.hasNext()) {
//                Entry<String, Object> entry = it.next();
//                String key = entry.getKey();
//                if (StringUtils.isEmpty(key)) {
//                    continue;
//                }
//                if (key.endsWith("Ignore")) {
//                    continue;
//                }
//                if (key.startsWith("$")) {
//                } else if (key.endsWith("Contains")) {
//                    query.addCriteria(Criteria.where(key.replaceFirst("Contains", "")).regex(
//                            (String) entry.getValue()));
//                } else {
//                    query.addCriteria(Criteria.where(key).is(entry.getValue()));
//                }
//            }
//        }
//        return query;
//    }
//
//    /**
//     * 格式化更新条件
//     *
//     * @param param
//     * @return
//     */
//    private Update parseUpdate(Map<String, Object> param) {
//        Update update = new Update();
//        if (param != null && !param.isEmpty()) {
//            Iterator<Entry<String, Object>> it = param.entrySet().iterator();
//            while (it.hasNext()) {
//                Entry<String, Object> entry = it.next();
//                String key = entry.getKey();
//                if (StringUtils.isEmpty(key)) {
//                    continue;
//                }
//                if (key.endsWith("Ignore")) {
//                    continue;
//                }
//                if (key.startsWith("$")) {
//                } else {
//                    update.set(key, entry.getValue());
//                }
//            }
//        }
//        return update;
//    }
//
//    @Override
//    public boolean save(Object entity) {
//        try {
//            mongoTemplate.save(entity);
//        } catch (Exception e) {
//            e.printStackTrace();
//            return false;
//        }
//        return true;
//    }
//}
